//===================================================================================
// Microsoft patterns & practices
// Composite Application Guidance for Windows Presentation Foundation and Silverlight
//===================================================================================
// Copyright (c) Microsoft Corporation.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===================================================================================
// The example companies, organizations, products, domain names,
// e-mail addresses, logos, people, places, and events depicted
// herein are fictitious.  No association with any real company,
// organization, product, domain name, email address, logo, person,
// places, or events is intended or should be inferred.
//===================================================================================
using System;

namespace Microsoft.Practices.Prism.Regions
{
	/// <summary>
	/// Provides additional methods to the <see cref="INavigateAsync"/> interface.
	/// </summary>
	public static class NavigationAsyncExtensions
	{
		/// <summary>
		/// Initiates navigation to the target specified by the <paramref name="target"/>.
		/// </summary>
		/// <param name="navigation">The navigation object.</param>
		/// <param name="target">The navigation target</param>
		public static void RequestNavigate(this INavigateAsync navigation, string target)
		{
			RequestNavigate(navigation, target, nr => { });
		}

		/// <summary>
		/// Initiates navigation to the target specified by the <paramref name="target"/>.
		/// </summary>
		/// <param name="navigation">The navigation object.</param>
		/// <param name="target">The navigation target</param>
		/// <param name="navigationCallback">The callback executed when the navigation request is completed.</param>
		public static void RequestNavigate(this INavigateAsync navigation, string target, Action<NavigationResult> navigationCallback)
		{
			if (navigation == null) throw new ArgumentNullException("navigation");
			if (target == null) throw new ArgumentNullException("target");

			var targetUri = new Uri(target, UriKind.RelativeOrAbsolute);

			navigation.RequestNavigate(targetUri, navigationCallback);
		}

		/// <summary>
		/// Initiates navigation to the target specified by the <see cref="Uri"/>.
		/// </summary>
		/// <param name="navigation">The navigation object.</param>
		/// <param name="target">The navigation target</param>
		public static void RequestNavigate(this INavigateAsync navigation, Uri target)
		{
			if (navigation == null) throw new ArgumentNullException("navigation");

			navigation.RequestNavigate(target, nr => { });
		}
	}
}